home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
ikap
/
etc2
/
src.lzh
/
GetPcmPath.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-02-04
|
4KB
|
196 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mbctype.h>
#include <sys/xglob.h>
#include "GetPcmPath.h"
/*
ラベル DEMO を定義してコンパイルすると、単独実行可能なデモを生成します
コンパイル方法
gcc -DDEMO -c GetPcmPath.c
lk GetPcmPath.o -o GetPcmPath.x -l libc.a libgnu.a
*/
/*
環境変数 zmusic 及び zmusic0~zmusic9 から fname で指定した .PCM ファイルを検索し、
full_fname に格納する。カレントディレクトリに存在した場合は fname をそのまま返す。
返り値
= !0 : .PCM ファイルが見つかった
= 0 : .PCM ファイルが見つからなかった
*/
int GetPcmPath (char *fname, char *full_fname)
{
FILE *fp;
unsigned char *zmusic_env; /* 環境変数 zmusic */
unsigned char *p1;
/* まずカレントディレクトリから fname を探す */
fp = fopen (fname, "r");
if (fp) {
fclose (fp);
strcpy (full_fname, fname);
return (!0);
}
/* 環境変数 zmusic のパスから探す */
zmusic_env = getenv ("zmusic");
if (zmusic_env == NULL)
return (0);
p1 = zmusic_env;
/* 環境変数 zmusic の各要素を調べるループ */
while(*p1) {
unsigned char base_path[256 + 1]; /* 環境変数zmusicから1要素切り出したパス */
unsigned char *p2;
p2 = base_path;
/* 環境変数 zmusic から1要素切り出して base_path に格納 */
for (;;) {
unsigned char c;
c = *p2++ = *p1++;
if (ismbblead (c)) {
*p2++ = *p1++;
continue;
}
if (c == ';')
break;
if (c == '\0') {
p1--; /* '\0' の上を指すように */
break;
}
}
*--p2 = '\0'; /* 末尾に '\0' を付ける */
if ((base_path[0] == '/') || (base_path[0] == '-')) {
/* "/0" などの補助環境変数だった場合 */
char zmusicn_env_name[8] = "zmusic0"; /* 最後の '0' を書き替える */
unsigned char branch_path[256 + 1];
unsigned char *zmusicn_env; /* 環境変数 zmusic0~9 */
unsigned char *pn1, *pn2, *pn2_last;
if (!isdigit (base_path[1])) /* "/0"~"/9" か確認 */
continue;
zmusicn_env_name[6] = base_path[1]; /* 最後の '0' を書き替える */
zmusicn_env = getenv (zmusicn_env_name);
if (zmusicn_env == NULL)
continue;
strcpy (branch_path, base_path + 2); /* "/0" 等を飛ばすから +2 */
_addlastsep (branch_path);
pn2_last = branch_path + strlen (branch_path); /* branch_path の末尾を指す */
pn1 = zmusicn_env;
/* 環境変数 zmusic0~9 の各要素を調べるループ */
while(*pn1) {
pn2 = pn2_last;
/* 環境変数 zmusic0~9 から1要素切り出して branch_path に格納 */
for (;;) {
unsigned char c;
c = *pn2++ = *pn1++;
if (ismbblead (c)) {
*pn2++ = *pn1++;
continue;
}
if (c == ';')
break;
if (c == '\0') {
pn1--; /* '\0' の上を指すように */
break;
}
}
*--pn2 = '\0';
_addlastsep (branch_path);
strcat (branch_path, fname);
_tobslash (branch_path);
#ifdef DEBUG
printf ("branch_path=%s\n", branch_path);
#endif
fp = fopen (branch_path, "r");
if (fp) {
fclose (fp);
strcpy (full_fname, branch_path);
return (!0);
}
}
} else {
/* 普通にディレクトリが指定されていた場合 */
_addlastsep (base_path);
strcat (base_path, fname);
_tobslash (base_path);
#ifdef DEBUG
printf ("base_path=%s\n", base_path);
#endif
fp = fopen (base_path, "r");
if (fp) {
fclose (fp);
strcpy (full_fname, base_path);
return (!0);
}
}
}
return (0);
}
#ifdef DEMO
void usage (void)
{
puts ("環境変数 zmusic から .PCM ファイルを検索するデモ GetPcmPath.X ver0.01\n"
" programmed by Mitsuky <FreeSoftware>\n"
"使用法 : GetPcmPath ファイル名\n"
);
}
int main (int argc, char *argv[])
{
int i;
int slash_flag = 0;
char *fname; /* 展開前のファイル名 */
char full_fname[92]; /* フルパスのファイル名が返るバッファ */
{
char *temp;
temp = getenv ("SLASH");
if ((temp != NULL) && (*temp == '/')) {
slash_flag = 1;
}
}
for (i = 1; i < argc; i++) {
if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
switch (*(argv[i] + 1)) {
default:
usage ();
return (-1);
}
} else {
fname = argv[i];
}
}
if (fname == NULL) {
usage ();
return (-1);
}
if (GetPcmPath (fname, full_fname)) {
printf ("%s を環境変数 zmusic から検索した結果、%s が見つかりました\n", fname, full_fname);
} else {
printf ("%s が見つかりません\n", fname);
}
return (0);
}
#endif